import { sendError } from "h3"
import {createUser, getUserByUsername} from "~/server/db/users.js";
import bcrypt from "bcrypt";
import {generateTokens, sendRefreshToken} from '../../utils/jwt.js'
import {createRefreshToken} from '../../db/refreshTokens.js'
import {userTransformer} from "~/server/transformers/user.js";


export  default defineEventHandler(async (event)=>{
    const body = await readBody(event);
    const { username, password } = body
    // postman调用跟文件夹成对应关系  http://localhost:3000/api/auth/login 因为是服务端渲染
    // 这里可以请求别人后端，也可以直接写  这个项目是自己搭建得
    // 1.拿到用户名和密码
    if (!username || !password) {
        return sendError(event, createError({
            statusCode: 400,
            statusMessage: '密码错误'
        }))
    }
    // 2 . 去数据库查找 如果没有就报错  （目前是直接掉postman接口注册的）
    let user = await getUserByUsername(username)
    if (!user) { //没有名字就注册
        const userData = {
            username,
            email:'123456@qq.com',
            password,
            name:username,
            profileImage: 'https://picsum.photos/200/200'
        }
        user = await createUser(userData)
    }else  if (!await bcrypt.compare(password,user.password)){//密码不相等的情况
        return sendError(event, createError({
            statusCode: 400,
            statusMessage: '用户名或密码错误'
        }))
    }
    // 通过用户名密码生成 token令牌和刷新token的令牌   jwt
    const {accessToken,refreshToken}  = generateTokens(user)
    //把刷新的数据关联到数据库
    await createRefreshToken({
        token: refreshToken,
        userId: user.id
    })
    // 给返回的http请求cookie添加刷新token -- 后续对应refresh.get.js那个请求
    sendRefreshToken(event,refreshToken)

    return {
        access_token: accessToken, user: userTransformer(user)
    }
})